.TITLE DRGEF .IDENT /04.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; J. E. PROVINO 21-SEP-78 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; B. S. MCCARTHY ; T. M. MARTIN ; ; MODIFIED BY: ; ; J. M. LAWLER 29-JUN-83 04.00 ; ; JL162 -- FINISH CONDITIONALIZATION OF GROUP GLOBAL EFNS ; ; J. W. BERZLE 07-SEP-83 04.01 ; ; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES ; ; ; MACRO LIBRARY CALLS ; .MCALL BGCK$A ;+ ; **-$DRCRE-CREATE GROUP GLOBAL EVENT FLAGS ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE GROUP GLOBAL EVENT ; FLAGS FOR A SPECIFIED GROUP. IF THE SPECIFIED GROUP MATCHES THE ; TASK'S OWN GROUP, THE EVENT FLAG USE COUNT IS INCREMENTED, EFFECTING ; A "LOCK" OPERATION FOR THE FLAGS SUCH THAT PREMATURE ELIMINATION ; OF THE FLAGS BY A TASK WHICH SHARES THEM IS PREVENTED. ; ; IF THE EVENT FLAG GROUP ALREADY EXISTS, THE SPECIFIED GROUP IS THE ; SAME AS THE TASK'S OWN GROUP, AND THE EVENT FLAGS ARE UNLOCKED, THIS ; DIRECTIVE WILL LOCK THE EVENT FLAGS FOR THE ISSUING TASK. ; ; ; DPB FORMAT: ; ; WD. 00 -- DIC(157.),DPB SIZE(2.). ; WD. 01 -- GROUP NUMBER ; ; INPUTS: ; ; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK ; R3=POINTER TO WD. 1 IN THE DPB ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IF ALLOCATION FAILURE. ; DIRECTIVE STATUS OF 'D.RS16' IF NON-PRIVILEGED TASK ; ATTEMPTS TO CREATE EVENT FLAGS FOR ANOTHER GROUP. ; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF GROUP GLOBAL ; EVENT FLAGS ALREADY EXIST. ; DIRECTIVE STATUS OF 'D.RS91' IS RETURNED IF GROUP IS ; INVALID. ;- .IF DF, G$$GEF .ENABL LSB $DRCRE::CALL 300$ ;DO FLAGS ALREADY EXIST? BCC 40$ ;IF CC FOUND MOV R0,-(SP) ;SAVE R0 MOV #G.LGTH,R1 ;GET LENGTH OF GROUP GLOBAL CNTRL BLK MOV R2,R3 ;COPY TASKS GROUP NUMBER CALL $ALOCB ;ALLOCATE A BLOCK FOR GROUP GLOBAL FLAGS BCS 70$ ;IF CS ALLOCATION FAILURE MOV @(SP),(R0) ;POINT NEW BLOCK TO REMAINDER OF LIST MOV R0,@(SP)+ ;LINK NEW BLOCK INTO LIST TST (R0)+ ;POINT PAST LINK WORD (G.LNK) MOVB R4,(R0)+ ;STORE GROUP NUMBER (G.GRP) CLRB (R0)+ ;CLEAR STATUS BYTE (G.STAT) CLR (R0)+ ;INITIALIZE ACCESS COUNT (G.CNT) CMP R3,R4 ;ARE THESE FLAGS FOR THE TASK'S OWN GROUP? BNE 20$ ;IF NE NO, DO NOT LOCK THEM INC -2(R0) ;LOCK FLAGS BY INCREMENTING USE COUNT BIS #T3.GFL,(R5) ;AND MAKE A NOTE OF THIS IN TASK'S TCB INCB T.GGF-T.ST3(R5) ;AND INCREMENT TASK'S ACCESS COUNT 20$: CLR (R0)+ ;CLR FIRST EVENT FLAG WORD (G.EFLG) CLR (R0) ;CLR SECOND EVENT FLAG WORD (G.EGLG+2) 30$: RETURN ; 40$: CLRB G.STAT(R1) ;CLEAR MARKED FOR DELETE CMP R2,R4 ;TASK'S OWN GROUP? BNE 110$ ;IF NE NO DON'T LOCK THEM BIT #T3.GFL,(R5) ;ALREADY LOCKED? BNE 110$ ;IF NE YES BIS #T3.GFL,(R5) ;MARK TCB AS HAVING LOCKED EVENT FLAGS INC G.CNT(R1) ;LOCK THE EVENT FLACK CONTROL BLOCK INCB T.GGF-T.ST3(R5) ;RECORD ACCESS FOR SLAVE TASKING BR 110$ ;INDICATE FLAGS ALREADY EXIST ;+ ; **-DRELE-ELIMINATE GROUP GLOBAL EVENT FLAGS ; ; THE ELIMINATE GROUP GLOBAL EVENT FLAGS DIRECTIVE ELIMINATES THE ; GROUP GLOBAL EVENT FLAGS FOR THE SPECIFIED GROUP. IF THE ISSUING ; TASK HAD LOCKED THE EVENT FLAGS VIA A PREVIOUSLY ISSUED CREATE ; GROUP GLOBAL EVENT FLAGS DIRECTIVE, THEY WILL ALSO BE UNLOCKED. ; ; THE UNLOCK GROUP GLOBAL EVENT FLAGS DIRECTIVE UNLOCKS THE EVENT ; FLAGS FOR THE ISSUING TASK'S GROUP. ; ; ; DPB FORMAT FOR THE ELIMINATE GROUP GLOBAL EVENT FLAG DIRECTIVE: ; ; WD. 0 -- DIC. (159.),DBP SIZE(2.) ; WD. 1 -- GROUP NUMBER ; ; DPB FORMAT FOR THE UNLOCK GROUP GLOBAL EVENT FLAG DIRECTIVE: ; ; WD. 0 -- DIC. (159.),DPB SIZE(1.) ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK ; R3=ADDRESS OF THE DBP + 2 ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF NON-PRIVILEGED ; TASK ATTEMPTS TO ELIMINATE FLAGS FOR ANOTHER GROUP. ; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF EVENT FLAG ; BLOCK IS ALREADY MARKED FOR DELETE. ; DIRECTIVE STATUS OF 'D.RS91' IS RETURNED IF THE SPECIFIED ; EVENT FLAG GROUP IS GREATER THAN 377. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF THE SPECIFIED ; EVENT FLAG GROUP DOES NOT EXIST. ;- $DRELE::MOVB -(R3),R0 ;GET DPB SIZE CMPB (R3)+,#2 ;IS THIS THE ELIMINATE DIRECTIVE? BEQ 50$ ;IF EQ YES ASR R0 ;IS THIS THE UNLOCK DIRECTIVE? BNE 120$ ;IF NE NO, ILLEGAL DPB SIZE CALL $UNLCK ;ATTEMPT TO UNLOCK THE EVENT FLAGS BCS 110$ ;IF CS ALREADY UNLOCKED $ELIM:: BNE 45$ ;IF NE G.CNT<>0, DON'T ELIMINATE FLAGS TSTB G.STAT(R1) ;MARKED FOR ELIMINATION? BNE 65$ ;IF NE YES, ELIMINATE THE FLAGS 45$: RETURN ; 50$: CALL 300$ ;LOOK FOR THE SPECIFIED EVENT FLAG BCS 100$ ;IF CS FLAGS NOT FOUND CMP R2,R4 ;ELIMINATING TASK'S OWN GROUP? BNE 60$ ;IF NE NO, DON'T UNLOCK THEM BIT #T3.GFL,(R5) ;ARE THE EVENT FLAGS LOCKED? BEQ 60$ ;IF EQ NO BISB #GS.DEL,G.STAT(R1) ;MARK THE FLAGS FOR ELIMINATION CALL 200$ ;UNLOCK THE EVENT FLAGS BEQ 65$ ;IF EQ, G.CNT=0, ELIMINATE THE FLAGS RETURN 60$: TSTB G.STAT(R1) ;ALREADY MARKED FOR DELETE? BNE 110$ ;IF NE YES INCB G.STAT(R1) ;MARK IT FOR DELETE TST G.CNT(R1) ;STILL BEING USED? BNE 210$ ;IF NE YES, DON'T ELIMINATE THEM YET 65$: CALLR $ELGEF ;ELIMINATE THEM NOW 70$: DRSTS D.RS1 ;ALLOCATION FAILURE 80$: DRSTS D.RS91 ;INVALID GROUP 90$: DRSTS D.RS16 ;PRIVILEGE VIOLATION 100$: DRSTS D.RS97 ;GROUP NOT FOUND 110$: DRSTS D.RS17 ;FLAGS ALREADY EXIST OR ALREADY MARKED FOR DELETE 120$: DRSTS D.RS99 ;ILLEGAL DPB SIZE 200$: BIC #T3.GFL,(R5) ;MARK TCB AS NOT HAVING EFNS LOCKED DECB T.GGF-T.ST3(R5) ;DECREMENT TASK'S ACCESS COUNT DEC G.CNT(R1) ;DECREMENT THE FLAGS USE COUNT 210$: RETURN 300$: ADD #T.ST3,R5 ;POINT TO THIRD STATUS WORD OF TCB MOVB H.CUIC+1(R4),R2 ;GET TASK'S GROUP NUMBER MOV (R3),R4 ;GET SPECIFIED GROUP NUMBER BNE 310$ ;IF NE ONE WAS SPECIFIED MOV R2,R4 ;ASSUME TASK'S OWN GROUP BR 325$ ;JOIN COMMON CODE 310$: BIT #T3.PRV,(R5) ;TASK ALLOWED TO SPECIFY ANY GROUP? BNE 320$ ;IF NE YES CMPB R4,R2 ;ATTEMPTING TO SPECIFY ANOTHER GROUP? BNE 90$ ;IF NE YES 320$: CMP R4,#377 ;LEGAL GROUP NUMBER? BHI 80$ ;IF HI NO 325$: CALLR $SRGEF ;TRY TO FIND THE GROUP'S CNTRL BLK ;+ ; ; THIS ROUTINE WILL UNLOCK THE GROUP GLOBAL EVENT FLAGS FOR THE ; TASK'S GROUP IF THE TASK HAS THEM LOCKED FROM A PREVIOUSLY ; ISSUED CREATE GROUP GLOBAL EVENT FLAG DIRECTIVE. ; ; INPUTS: ; ; R4=ADDRESS OF THE CURRENT TASK'S HEADER ; R5=ADDRESS OF THE CURRENT TASK'S TCB ; ; OUTPUTS: ; ; C=1 IF THE EVENT FLAGS FOR THE TASK'S GROUP WERE NOT ; LOCKED BY THE TASK ; C=0 IF THE EVENT FLAGS WERE SUCCESSFULLY UNLOCKED. ; ; R4 IS DESTROYED BY THIS ROUTINE ; R5 = R5+T.ST3 ; ;- $UNLCK::ADD #T.ST3,R5 ;POINT TO THE THIRD TASK STATUS WORD BIT #T3.GFL,(R5) ;ARE THE TASKS GROUP GLOBALS LOCKED? BEQ 400$ ;IF EQ NO MOVB H.CUIC+1(R4),R4 ;GET TASK'S GROUP CODE CALL $SRGEF ;FIND THE EVENT FLAG CNTRL BLK BCC 200$ ;JOIN COMMON CODE WITH THE DIRECTIVE BGCK$A BF.DIR,BE.GGF,FATAL ;TASK LOCKED TO NONEXISTANT FLAGS 400$: SEC ;TASK NOT LOCKED TO EVENT FLAG RETURN ; .DSABL LSB .ENDC ; DF G$$GEF .END